#include "SorteoBrincoConfiguracion.h"

SorteoBrincoConfiguracion::SorteoBrincoConfiguracion() : GameConfiguration()
{
}

SorteoBrincoConfiguracion::~SorteoBrincoConfiguracion()
{
}

void SorteoBrincoConfiguracion::save()
{

}

void SorteoBrincoConfiguracion::update( QByteArray )
{

}

void SorteoBrincoConfiguracion::deserialize( QByteArray bufferConfig )
{
	unsigned int contadorDatos = 0;
	
	char * bufferSorteoConfig = ( char *) malloc( bufferConfig.size() + 1 );
	
	memset( bufferSorteoConfig, '\0', bufferConfig.size() + 1 );
	
	for( int i = 0 ; i < bufferConfig.size() ; i++ )
		bufferSorteoConfig[i] = bufferConfig.at(i);

	BMMemoryUtils memoUtils;

	// Tipo de transaccion
	memoUtils.MemoryCopy( &m_Transaccion , bufferSorteoConfig , sizeof( m_Transaccion ) );
	contadorDatos += sizeof(m_Transaccion);
	
	// dia de sorteo
	memoUtils.MemoryCopy( &m_diaSorteo, bufferSorteoConfig + contadorDatos, sizeof(m_diaSorteo) );
	contadorDatos += sizeof(m_diaSorteo);

	// mes de sorteo
	memoUtils.MemoryCopy( &m_mesSorteo , bufferSorteoConfig + contadorDatos , sizeof(m_mesSorteo) );
	contadorDatos += sizeof(m_mesSorteo);

	// Anio de sorteo
	memoUtils.MemoryCopy( &m_anioSorteo, bufferSorteoConfig + contadorDatos , sizeof(m_anioSorteo) );
	contadorDatos += sizeof(m_anioSorteo);

	// dia de cierre sorteo
	memoUtils.MemoryCopy( &m_diaCierreSorteo, bufferSorteoConfig + contadorDatos , sizeof(m_diaCierreSorteo) );
	contadorDatos += sizeof(m_diaCierreSorteo);

	// mes de cierre sorteo
	memoUtils.MemoryCopy( &m_mesCierreSorteo, bufferSorteoConfig + contadorDatos, sizeof(m_mesCierreSorteo) );
	contadorDatos += sizeof(m_mesCierreSorteo);

	// Anio de cierre sorteo
	memoUtils.MemoryCopy( &m_anioCierreSorteo, bufferSorteoConfig + contadorDatos, sizeof(m_anioCierreSorteo) );
	contadorDatos += sizeof(m_anioCierreSorteo);

	// hora de cierre de sorteo
	memoUtils.MemoryCopy( &m_horaCierreSorteo, bufferSorteoConfig + contadorDatos, sizeof(m_horaCierreSorteo) );
	contadorDatos += sizeof(m_horaCierreSorteo);

	// minutos de cierre de sorteo
	memoUtils.MemoryCopy( &m_minutosCierreSorteo , bufferSorteoConfig + contadorDatos , sizeof(m_minutosCierreSorteo) );
	contadorDatos += sizeof(m_minutosCierreSorteo);

	// segundos de cierre de sorteo
	memoUtils.MemoryCopy( &m_segundosCierreSorteo , bufferSorteoConfig + contadorDatos , sizeof(m_segundosCierreSorteo) );
	contadorDatos += sizeof(m_segundosCierreSorteo);

	// numero de sorteo
	memoUtils.MemoryCopy( &m_nroSorteo, bufferSorteoConfig + contadorDatos, sizeof(m_nroSorteo) );
	contadorDatos += sizeof(m_nroSorteo);

	// descripcion de sorteo
	char descSorteoAux[11];
	memset( descSorteoAux , '\0' , 11);
	
	memoUtils.MemoryCopy( &descSorteoAux , bufferSorteoConfig + contadorDatos , 10 , BIG_ENDIAN );
	contadorDatos += 10;

	m_DescrSorteo = descSorteoAux;

	// Numero desde
	memoUtils.MemoryCopy( &m_nroDesde , bufferSorteoConfig + contadorDatos , sizeof(m_nroDesde) );
	contadorDatos+=sizeof(m_nroDesde);

	// Numero hasta
	memoUtils.MemoryCopy( &m_nroHasta , bufferSorteoConfig + contadorDatos , sizeof(m_nroHasta) );
	contadorDatos+=sizeof(m_nroHasta);

	// Minima cantidad de numeros
	memoUtils.MemoryCopy( &m_minCantNumeros , bufferSorteoConfig + contadorDatos , sizeof(m_minCantNumeros) );
	contadorDatos+=sizeof(m_minCantNumeros);
	
	// bitmap combinada
	memoUtils.MemoryCopy( &m_bitmapCombinada , bufferSorteoConfig + contadorDatos , sizeof(m_bitmapCombinada) );
	contadorDatos+=sizeof(m_bitmapCombinada);

	// cantidad de lineas adicionales
	memoUtils.MemoryCopy( &m_cantLineaAdicionales, bufferSorteoConfig + contadorDatos, sizeof(m_cantLineaAdicionales) );
	contadorDatos += sizeof(m_cantLineaAdicionales);

	/*** Carga de Lineas ADICIONALES ***/

	char lineaAddAux[FIXED_SIZE_LINEA_ADD + 1];
	memset( lineaAddAux , '\0' , FIXED_SIZE_LINEA_ADD + 1);

	for ( int j = 0 ; j < m_cantLineaAdicionales ; j++ )
	{
		memoUtils.MemoryCopy( lineaAddAux , bufferSorteoConfig + contadorDatos, FIXED_SIZE_LINEA_ADD , BIG_ENDIAN );
		contadorDatos += FIXED_SIZE_LINEA_ADD;
		m_LineasAddList.append( QString( lineaAddAux) );
	}

	// Proceso modalidades

	for ( int k = 0 ; k < CANT_FIJA_MODALIDADES ; k++ )
	{
		// obtengo la parte de datos fijos de cada modalidad
		char fixedBuffModalidad[FIXED_SIZE_MODALIDAD];
		memoUtils.MemoryCopy( fixedBuffModalidad , bufferSorteoConfig + contadorDatos , FIXED_SIZE_MODALIDAD , BIG_ENDIAN );
		contadorDatos += FIXED_SIZE_MODALIDAD;

		// obtengo lo anterior en un QByteArray
		QByteArray dataModalidad = "";
		for ( short m = 0 ; m < FIXED_SIZE_MODALIDAD ; m++ )
			dataModalidad.append( fixedBuffModalidad[m] );
		
		// obtengo la cantidad de lineas adicionales
		unsigned char cantLineasAdd = fixedBuffModalidad[ FIXED_SIZE_MODALIDAD - 1];

		// Agrego las lineas adicionas necesarias
		for ( short int n = 0 ; n < cantLineasAdd ; n++ )
		{
			// obtengo cada linea adicional
			char fixedBuffLineaAdd[ FIXED_SIZE_LINEA_ADD ];
			memoUtils.MemoryCopy( fixedBuffLineaAdd , bufferSorteoConfig + contadorDatos , FIXED_SIZE_LINEA_ADD , BIG_ENDIAN );
			contadorDatos += FIXED_SIZE_LINEA_ADD;

			// copio la linea adicional a un QByteArray
			QByteArray lineaAdd = "";
			for (short int k = 0 ; k < FIXED_SIZE_LINEA_ADD ; k++ )
				lineaAdd.append( fixedBuffLineaAdd[k] );

			dataModalidad.append( lineaAdd );
		}

		// creo la configuracion de la modalidad
		ModalidadConfiguracion * modalidadConf = new ModalidadConfiguracion();
		modalidadConf->deserialize( dataModalidad );

		// inserto la modalidad en el mapa
		m_ModalidadesMap.insert( modalidadConf->m_Codigo , modalidadConf );

	}

	free(bufferSorteoConfig);
}